package com.styletransfer.service;

import com.styletransfer.exception.BusinessException;
import com.styletransfer.mapper.TagMapper;
import com.styletransfer.model.ApiResponse;
import com.styletransfer.model.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 标签服务类
 * 
 * 这个类负责处理与标签相关的业务逻辑，包括标签的创建、更新、查询等。
 */
@Service
public class TagService {
    
    @Autowired
    private TagMapper tagMapper;
    
    /**
     * 创建标签
     * 
     * @param tag 标签对象
     * @return API响应
     */
    public ApiResponse<Tag> createTag(Tag tag) {
        // 检查是否为管理员
        if (!isAdmin()) {
            throw new BusinessException("只有管理员才能创建标签");
        }
        
        // 检查标签名称是否已存在
        Tag existingTag = tagMapper.findByName(tag.getName());
        if (existingTag != null) {
            throw new BusinessException("标签名称已存在");
        }
        
        // 设置默认值
        tag.setCreateTime(new Date());
        tag.setUpdateTime(new Date());
        
        // 插入标签
        tagMapper.insert(tag);
        
        return ApiResponse.success(tag);
    }
    
    /**
     * 更新标签
     * 
     * @param tag 标签对象
     * @return API响应
     */
    public ApiResponse<Tag> updateTag(Tag tag) {
        // 检查是否为管理员
        if (!isAdmin()) {
            throw new BusinessException("只有管理员才能更新标签");
        }
        
        // 检查标签是否存在
        Tag existingTag = tagMapper.findById(tag.getId());
        if (existingTag == null) {
            throw new BusinessException("标签不存在");
        }
        
        // 检查标签名称是否已存在（排除自身）
        Tag nameExistingTag = tagMapper.findByName(tag.getName());
        if (nameExistingTag != null && !nameExistingTag.getId().equals(tag.getId())) {
            throw new BusinessException("标签名称已存在");
        }
        
        // 设置更新时间
        tag.setCreateTime(existingTag.getCreateTime());
        tag.setUpdateTime(new Date());
        
        // 更新标签
        tagMapper.update(tag);
        
        return ApiResponse.success(tag);
    }
    
    /**
     * 删除标签
     * 
     * @param id 标签ID
     * @return API响应
     */
    public ApiResponse<Void> deleteTag(Long id) {
        // 检查是否为管理员
        if (!isAdmin()) {
            throw new BusinessException("只有管理员才能删除标签");
        }
        
        // 检查标签是否存在
        Tag tag = tagMapper.findById(id);
        if (tag == null) {
            throw new BusinessException("标签不存在");
        }
        
        // 删除标签
        tagMapper.delete(id);
        
        return ApiResponse.success();
    }
    
    /**
     * 根据ID查询标签
     * 
     * @param id 标签ID
     * @return API响应
     */
    public ApiResponse<Tag> findById(Long id) {
        Tag tag = tagMapper.findById(id);
        if (tag == null) {
            throw new BusinessException("标签不存在");
        }
        
        return ApiResponse.success(tag);
    }
    
    /**
     * 查询所有标签
     * 
     * @return API响应
     */
    public ApiResponse<List<Tag>> findAll() {
        List<Tag> tags = tagMapper.findAll();
        return ApiResponse.success(tags);
    }
    
    /**
     * 搜索标签
     * 
     * @param keyword 关键词
     * @return API响应
     */
    public ApiResponse<List<Tag>> search(String keyword) {
        List<Tag> tags = tagMapper.search(keyword);
        return ApiResponse.success(tags);
    }
    
    /**
     * 查询热门标签
     * 
     * @param limit 限制数
     * @return API响应
     */
    public ApiResponse<List<Tag>> findHot(Integer limit) {
        List<Tag> tags = tagMapper.findHot(limit);
        return ApiResponse.success(tags);
    }
    
    /**
     * 检查当前用户是否为管理员
     * 
     * @return 是否为管理员
     */
    private boolean isAdmin() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return authentication.getAuthorities().stream()
                .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"));
    }
}
